package com.chengqs.tomdog.engine.support;

import java.util.*;

public class InitParameters extends LazyMap<String> {

    public InitParameters() {
        super(false);
    }

    /**
     * 在 Registration 所表示的 Servlet 或 Filter 上设置具有给定名称和值的初始化参数。
     *
     * @param name 初始化参数名称
     * @param value 初始化参数值
     *
     * @return 如果更新成功，即，对于 Registration 所表示的 Servlet 或 Filter，具有给定名称的初始化参数尚不存在，否则返回 false
     *
     * @throws IllegalArgumentException，如果给定名称或值为 <tt>null</tt>
     */
    public boolean setInitParameter(String name, String value) {
        if (name == null || name.isEmpty()) {
            throw new IllegalArgumentException("Name is null or empty.");
        }
        if (value == null || value.isEmpty()) {
            throw new IllegalArgumentException("Value is null or empty.");
        }
        if (super.containsKey(name)) {
            return false;
        }
        super.put(name, value);
        return true;
    }

    public String getInitParameter(String name) {
        return super.get(name);
    }

    /**
     * 在由该 Registration 表示的 Servlet 或 Filter 上设置给定的初始化参数。
     *
     * <p>
     * 给定的初始化参数映射按值处理，
     * 即，对于映射中包含的每个初始化参数，此方法
     * 调用 {@link #setInitParameter(String,String)}。如果该方法对给定映射中的任何初始化参数返回
     * false，则不会执行任何更新，并且将返回 false。同样，如果映射包含
     * 具有 <tt>null</tt> 名称或值的初始化参数，则不会执行任何更新，并且将抛出 IllegalArgumentException。
     *
     * <p>
     * 返回的集合不受 {@code Registration} 对象支持，因此返回集合中的更改不会反映在 {@code Registration} 对象中，反之亦然。
     * </p>
     *
     * @param initParameters 初始化参数
     *
     * @return 一组（可能为空）存在冲突的初始化参数名称
     *
     * @throws IllegalArgumentException 如果给定的映射包含具有 <tt>null</tt> 名称或值的初始化参数
     */
    public Set<String> setInitParameters(Map<String, String> initParameters) {
        if (initParameters == null) {
            throw new IllegalArgumentException("initParameters is null.");
        }
        if (initParameters.isEmpty()) {
            return Set.of();
        }
        Set<String> conflicts = new HashSet<>();
        for (String name : initParameters.keySet()) {
            String value = initParameters.get(name);
            if (value == null) {
                throw new IllegalArgumentException("initParameters contains null value by name: " + name);
            }
            if (super.containsKey(name)) {
                conflicts.add(name);
            } else {
                super.put(name, value);
            }
        }
        return conflicts;
    }

    public Map<String, String> getInitParameters() {
        return super.map();
    }

    public Enumeration<String> getInitParameterNames() {
        return Collections.enumeration(super.map().keySet());
    }
}
